简单易懂!java实现钉钉机器人消息推送

您所在的位置:网站首页 钉钉机器人 python 发送文件 简单易懂!java实现钉钉机器人消息推送

简单易懂!java实现钉钉机器人消息推送

2024-01-05 22:39| 来源: 网络整理| 查看: 265

需求: 实现每个工作日的下午六点推送指定内容至钉钉群

①找到你需要推送的群 - 智能群助手 为群新增一个自定义机器人 在这里插入图片描述 ②对于你的机器人进行设置(名字啊头像啊 在这里插入图片描述

安全设置我一般勾【加签】也可以勾选自定义关键册或者ip限制 最后都是在转发到钉钉API接口的时候做校验用的 为了安全 dddd

③ 给你的项目导入钉钉开放的SDK包 Pom文件如下:

lippi-oapi-encrpt dingtalk 1.0.0 com.aliyun alibaba-dingtalk-service-sdk 1.0.1

现在可以正式开始开发了 需求分解:

每个工作日每天下午六点数据文本发送钉钉群

一、 每个工作日 由于内部用自己研发的考勤系统,有自己设定的排班考勤接口 如果是按照法定工作日 可以调用 http://timor.tech/api/holiday/info/2020-10-08 这个api去获取某天是否为国家法定假日 在这里插入图片描述 他的含义如下:

参数名含义type0:工作日 1:周末 2:假日name本日的名称如果部署法定假日则会显示周几week周一为1以此类推holiday假日专有 普通日期为null

现在就算是能知道今天是否是工作日了 如果是工作日就进行接下来的操作

二、每天下午六点 可以当作这个推送数据是定时生成的 使用SpringBoot基于注解来创建定时任务。 代码如下:

@Configuration //1.主要用于标记配置类,兼备Component的效果。 @EnableScheduling // 2.开启定时任务 public class DingTalkSchedule { /** * 工作日下午6点推送数据 */ @Scheduled(cron = "0 0 18 * * ? ") @Async public void pushData() { //今天是否是工作日 if (!isWorkDay(DateUtils.getDate(new Date(), "yyyy-MM-dd"))) { return; } //推送相关 数据来源你的机器人设置(仅设置安全密钥 String webhook = ""; String sercetKey= ""; messagePush(webhook,sercetKey); } }

三、销售数据文本组织

假设我们今天要推送的数据大致如下:

张元英在参加produce48前刚刚小学毕业

以图片+文本的形式进行推送 查阅钉钉开发文档的话我们能知道机器人推送的格式有下面几个 图片来自于钉钉的SDK包 具体这些消息发出来的样式参考钉钉开发者文档: 钉钉机器人开发

需求所需推送的是图片+文本的形式 我们这里就采用【actioncard】的消息类型

为什么不用markdown形式? 答:当然可以用markdown形式,但是markdown和actioncard的展现方式不一样 为了好看我还是选择用actioncard类型 actionCard推送 在这里插入图片描述

然后就是做推送了

/** * @Description: 推送iz*one 冷知识消息 * @Param: [webhook,sercetKey] 创建机器人的时候生成的机器人webhook和密钥如果是别的安全设置则参考别的方式 * @return: void * @Author: Nipppppp * @Date: 2021/2/26 14:13 */ public void messagePush(String webhook,String sercetKey){ //文本内容组织 StringBuilder text = new StringBuilder(); //图片 text.append("![screenshot](https://img-blog.csdnimg.cn/20210226132655473.png")); //换行 text.append("\n"); //文本 text.append("#### 张元英在参加produce48前刚刚小学毕业"); //钉钉actionCard推送对象 OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard(); //推送透出首页标题 (你收到这条推送的时候会显示的初内容 actionCard.setTitle("IZ*ONE 冷知识"); //放入你组织好的内容 actionCard.setText(text.toString()); //做推送 OapiRobotSendResponse resp = robotPushActionCardMessage(webhook,sercetKey,actionCard); //TODO 有需要的话可以保存一下发送的历史记录啥的 } /** * @Description: 推送actionCard消息模版 * @Param: [webhook,sercetKey,actionCard] * @return: void * @Author: Nipppppp * @Date: 2021/2/26 14:15 */ public OapiRobotSendResponse robotPushActionCardMessage(String webhook,String sercetKey, OapiRobotSendRequest.Actioncard actionCard) { try { DingTalkClient client = getDingTalkClient(webhook, sercetKey); OapiRobotSendRequest request = new OapiRobotSendRequest(); request.setMsgtype("actionCard"); request.setActionCard(actionCard); OapiRobotSendResponse response = client.execute(request); if (!ObjectUtils.isEmpty(response) && response.isSuccess()) { log.info("钉钉机器人推送actionCard成功:{}", actionCard.getText()); } else { log.error("钉钉机器人推送actionCard失败:{},{}", actionCard.getText(), response.getErrmsg()); } return response; } catch (NoSuchAlgorithmException e) { log.error("=======钉钉机器人推送actionCard异常:{}======", e.getMessage()); } catch (UnsupportedEncodingException e) { log.error("=======钉钉机器人推送actionCard异常:{}========", e.getMessage()); } catch (InvalidKeyException e) { log.error("=======钉钉机器人推送actionCard异常:{}=======", e.getMessage()); } catch (ApiException e) { log.error("=======钉钉机器人推送actionCard异常:{}=====", e.getErrMsg()); } return null; } /** * 获取钉钉对象 机器人仅设置密钥 * * @param webHook 机器人webHook * @param secretKey 机器人密钥 * @return * @throws NoSuchAlgorithmException * @throws InvalidKeyException * @throws UnsupportedEncodingException */ private DingTalkClient getDingTalkClient(String webHook, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException { Map sign = sign(secretKey); String aceRobotUrl = webHook + ("×tamp=" + sign.get("timestamp") + "&sign=" + sign.get("sign")); DingTalkClient client = new DefaultDingTalkClient(aceRobotUrl); return client; } /** * 计算签名 * * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException * @throws InvalidKeyException */ public static Map sign(String robotSecret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { Long timestamp = System.currentTimeMillis(); //机器人加签密钥 String stringToSign = timestamp + "\n" + robotSecret; Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(robotSecret.getBytes("UTF-8"), "HmacSHA256")); byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8"); Map map = new HashMap(2); map.put("timestamp", timestamp.toString()); map.put("sign", sign); return map; }

actionCard里面填装你自己的内容即可

最后就是编写测试方法或者自启动springboot任务调用一下方法看看推出来的东西咯 推送内容 就酱 如果推送业务或者机器人变多的话 最好写一个管理界面去管理你的机器人关联你推送的业务



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3